/* ⚠️
 * libs/token.js 用来处理服务器向客户端鉴权
 */

import jwt from "jsonwebtoken"

const config = require("../config/server.json")

/**
 * @description 解析一个 token，支持传入 header 内的 authorization 的值。
 * @param {String} token token 值
 * @return {any} token 的解析对象或者 null
 */
const verifyToken = function(token, noFormat) {
  try {
    if (token.includes(" ") && !noFormat) {
      token = token.split(" ")[1]
    }
    return jwt.verify(token, config.authorization.jwt)
  } catch (err) {
    return null
  }
}
exports.verifyToken = verifyToken

/**
 * @description 生成一个 token。
 * @param {String}  userName 用户名
 * @param {Object} userId 用户 ID
 * @return {String} token 值
 */
exports.setToken = function(userName = "", userId = 0, expiresHours = 1) {
  const token = jwt.sign(
    {
      username: userName,
      _id: userId
    },
    config.authorization.jwt,
    { expiresIn: expiresHours + "h" }
  )
  return token
}

/**
 * @description main.js 中用来存储 token 的方法。
 * @param {Object} ctx ctx
 * @param {Object} next next
 */
exports.checkToken = async function(ctx, next) {
  /* 鉴权 */
  let token = ctx.headers.authorization
  if (token) {
    let userInfo = verifyToken(token)
    if (userInfo && userInfo._id) {
      console.log("用户登录", userInfo)
      if (!ctx.state) {
        ctx.state = {
          userInfo
        }
      } else {
        ctx.state.userInfo = userInfo
      }
    }
    await next()
  } else {
    await next()
  }
}
